/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sp2p.peerToPeer.cliente;

import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import sp2p.Compartilhador;
import sp2p.cte.Constantes;
import sp2p.peerToPeer.Peer;

/**
 *
 * @author anderson
 */
public class Cliente implements Serializable, Runnable {

    private Peer peer;
    private Socket conexaoSocket;
    private File diretorioParaUpLoad;
    private boolean fimDoDownLoad;
    private String palavraChavePesquisa;
    private Peer peerDonoArquivo;
    private File arquivoDownload;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    public boolean achou = false;
    private Socket conexaoSocketDonload;

    public Socket getConexaoSocketDonload() {
        return conexaoSocketDonload;
    }

    public void setConexaoSocketDonload(Socket conexaoSocketDonload) {
        this.conexaoSocketDonload = conexaoSocketDonload;
    }

    public Cliente() {
    }

    public Cliente(Peer peer) {
        this.peer = peer;
        instalacaoDoLadoCliente();
    }

    public Cliente(Peer peer, Socket conexao) {
        this.peer = peer;
        this.conexaoSocket = conexao;
    }

    public void instalacaoDoLadoCliente() {
        diretorioParaUpLoad = new File(Constantes.getDIRETORIO_COMPARTILHADO());
        peer.criarDiretorioParaDownLoad(diretorioParaUpLoad);
    }

    /**
     * Metodo que realiza a pesquisa na lista compartilhada com todos os peers
     * @param servidor
     * @return true se a pesquisa obtiver sucesso
     * @throws java.io.IOException
     */
    public boolean pesquisaArquivo(String palavra_chave, String ip) throws IOException {
        boolean achouArquivo = false;       
        if (!Compartilhador.getMapaPesquisas().keySet().isEmpty()) {
            Set<Peer> peers = Compartilhador.getMapaPesquisas().keySet();
            for (Peer peerListaCompartilhada : peers) {
                List<File> listaDeArquivos = Compartilhador.getMapaPesquisas().get(peerListaCompartilhada);//verificando arquivo(palavra_chave) na lista do servidor
                for (File arquivoQueTaNaLista : listaDeArquivos) {
                    if (arquivoQueTaNaLista.getName().equalsIgnoreCase(palavra_chave)) {//verificando se achou o arquivo procurado
                        achou = achouArquivo = true;
                        setPeerDonoArquivo(peerListaCompartilhada);

                        setArquivoDownload(arquivoQueTaNaLista);
                        break;
                    }
                }
            }
            if (!achouArquivo) {
                System.out.println("-------------------->Arquivo nao encontrado....");
            }
        } else {
            System.out.println("Nao ha servidores na rede...");
        }
      //  liberar lista de servidores do arquivo

        return achouArquivo;
    }

    /**
     * metodo que forca que um usuario a compartilhar pelo menos um arquivo com os
     * demais usuarios da rede
     * @param peer - peer que vai compartilhar arquivos
     * @param diretorioLocal - diretorio com os arquivos que serao compartilhados na rede p2p
     * @param servidor - utilizado para notificar um cliente sobre quem e o dono do arquivo
     * @return true se o cliente compartilhou pelo menos um arquivo
     */
    public boolean forcarCompartilhamentoArquivos(Peer peer, File diretorioLocal) {
        boolean compartilhouArquivo = false;
        if (diretorioLocal.listFiles().length != 0) {//listando meu diretorio local
            if (Compartilhador.getMapaPesquisas().get(peer) == null) {
                List<File> arquivosParaCompartilhar = new ArrayList<File>();
                for (File arquivo : diretorioLocal.listFiles()) {
                    arquivosParaCompartilhar.add(arquivo);
                }
                Compartilhador.getMapaPesquisas().put(peer, arquivosParaCompartilhar);
                compartilhouArquivo = true;
            } else {
                List<File> listaDeArquivosLocais = Arrays.asList(diretorioLocal.listFiles());
                Compartilhador.getMapaPesquisas().put(peer, listaDeArquivosLocais);
                compartilhouArquivo = true;
            }
        } else {
            System.out.println("Diretorio vazio - forneca algo para compartilhamento!");
        }

        return compartilhouArquivo;
    }

    public List<File> getListArquivos() {
        File file = new File(Constantes.getDIRETORIO_COMPARTILHADO());
        return Arrays.asList(file.listFiles());
    }

    @Override
    public void run() {
        try {
            conexaoSocket = new Socket("127.0.0.1", 1234);
            in = new ObjectInputStream(conexaoSocket.getInputStream());
            out = new ObjectOutputStream(conexaoSocket.getOutputStream());
            while (true) {
                System.out.println("servidor disse: " + in.readObject());
                out.writeObject(this.getPeer().getServidor().getIp());//criando registro no servidor
                out.flush();
                while (!achou) {
                    String ip = in.readObject().toString();
                    System.out.println("Digite o arquivo: \n");
                    pesquisaArquivo(new Scanner(System.in).nextLine(), ip);
                    
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        Peer p = new Peer();
        p.setNomePeer("aaaaaaaaaaaa");
        Thread t = new Thread(p);
        t.start();
    }

    /**
     * @return the peer
     */
    public Peer getPeer() {
        return peer;
    }

    /**
     * @param peer the peer to set
     */
    public void setPeer(Peer peer) {
        this.peer = peer;
    }

    /**
     * @return the conexao
     */
    public Socket getConexao() {
        return conexaoSocket;
    }

    /**
     * @param conexao the conexao to set
     */
    public void setConexao(Socket conexao) {
        this.conexaoSocket = conexao;
    }

    /**
     * @return the fimDoDownLoad
     */
    public boolean isFimDoDownLoad() {
        return fimDoDownLoad;
    }

    /**
     * @param fimDoDownLoad the fimDoDownLoad to set
     */
    public void setFimDoDownLoad(boolean fimDoDownLoad) {
        this.fimDoDownLoad = fimDoDownLoad;
    }

    public String getPalavraChavePesquisa() {
        return palavraChavePesquisa;
    }

    public void setPalavraChavePesquisa(String palavraChavePesquisa) {
        this.palavraChavePesquisa = palavraChavePesquisa;
    }

    /**
     * @return the peerDonoArquivo
     */
    public Peer getPeerDonoArquivo() {
        return peerDonoArquivo;
    }

    /**
     * @param peerDonoArquivo the peerDonoArquivo to set
     */
    public void setPeerDonoArquivo(Peer peerDonoArquivo) {
        this.peerDonoArquivo = peerDonoArquivo;
    }

    /**
     * @return the arquivoDownload
     */
    public File getArquivoDownload() {
        return arquivoDownload;
    }

    /**
     * @param arquivoDownload the arquivoDownload to set
     */
    public void setArquivoDownload(File arquivoDownload) {
        this.arquivoDownload = arquivoDownload;
    }

    public String toString() {
        return "novo cliente";
    }
}
